| ../. | ||||
| SEAC10 | ||||
| MTCT10 - TEDA11 | ||||
Compressie gebruiken en toepassen in een multibound connected wereld Verslag dynamische media ripper / encodermet de hoeveelheid aan devices, bestandsformaten en andere die tegenwoordig bestaan is het moeilijk een 'good-for-all' manier te vinden om je media op te slaan, je weet namelijk nooit wat de dag van morgen voor eisen zal stellen en op welk device je het za gaan afspelenTegenwoordig zijn de PDA's krachtig genoeg voor indrukwekkende media stunts te vertonen echter het schermoppervlak en opslagruimte zijn stukken minder als een desktop computer of tv-set-top-box. Een manier van on the fly omrenderen van media naargelang de nood er is kan in zo'n geval een oplossing bieden, stel je hierbij een pc voor die volledig dedicated is aan het weergeven, opslaan, omrenderen en catalogiseren van media; grote harddrive, genoeg rekencapaciteit, ethernet en evt. een beamer of groot scherm. zover niks bijzonders, de meesten onder ons zullen wel zo'n pc in huis hebben; tjokvol backups van legaal aangeschafte DVD's natuurlijk. Het bijzondere aan deze machine gaan de programmaatjes zijn die op de achtergrond de CD speler pollen om te kijken of er nieuwe media in voorradig ligt, langs zn opslagmedia loopt om de index up 2 date te houden, en de http frontend die clients afvangt onderweg naar hun media
Clients kunnen connecten op enkele manieren:
via http wordt het clientplatform vrij dynamisch afgelezen, hier bestaan de normale webdeveloper trucjes voor die ik hieronder zal beschrijven onderdelenEen dergerlijke render-, file-, en application-server moet bestaan uit redelijk wat onderdelen, ik geef dan ook een opsomming van alle software waar een stuk 'film' doorheengaat vanaf het dvd-doosje tot de client pc / pda / mediaspeler
Bovenstaande dingen dan ook liefst op een manier dat we niet aan een bepaald operating system of proprietary bestandsformaat vastzitten, elk onderdeel moet ook 'los' van mekaar kunnen werken, maw met voor elk programmaatje een dedicated server. We zoeken naar oplossingen die op de 3 meest voorkomende platforms van dit moment (windows, linux, macintosh) beschikbaar zijn en waarbij dat er tussen deze versies weinig merkbaar verschil zit; dit geeft meestal aan dat voor elk platform waarschijnlijk dezelfde codebase gebruikt is. Die portability is belangrijk zodat als er in de toekomst op een nieuw systeem overgeschakeld wordt (GNU/Hurd) er zonder al teveel moeite kan overgeschakeld worden. Een goed voorbeeld van software waar dit niet het geval is is bijv. Internet Explorer 5. Als je de verschillen bekijkt in functionaliteit, ondersteuning van css, javascript, look 'n feel, footprint en nog vele andere dingen vraag je je af waarom twee overduidelijk andere programma's dezelfde naam dragen, maar ik dwaal af. Ik zet bovenstaande punten nogmaals onder elkaar en bespreek de gekozen software oplossingen.
Software - Details
the joys of mplayerMplayer is een frontend naar verschillende media libraries en kan van en naar elke bestandsformaat renderen wat hij kan afspelen , .. door de open structuur worden er steeds meer mediaformaten in dit programma ondersteund. Bij mplayer zit er ook mencoder die de encoding doet naar en van al die bestandsformaten. Verder kan dit versatile stukje software DVD's afspelen, snapt het TV kaarten en kan je de bitrate, geluidskwaliteit ea haarfijn instellen voor elk specifiek doel.
web / fileserverelke server kan volstaan, apache / samba genieten mijn persoonlijke voorkeur wegens de grote mate van aanpasbaarheid die deze programma's hebben, maar in deze toepassing zullen de deamons enkel files moeten doorblazen zonder al te veel toeters of bellen. IIS, netscape, apache, omnihttpd, thttpd,.... op zich zijn ze er allemaal voor geschikt omdat de werkelijke interface zich op filesystem niveau zal bevinden.
virtual file systemEen filesystem als interface gebruiken kan je tot erg transparante solutions komen. omdat je een filesystem 'bent' werken alle top level programma's automatisch ook met die interface, hierdoor is het mogelijk een willekeurig ander protocol de media encoding functionaliteit mee te geven door simpelweg de virtual file root te 'sharen' via die service.Op macOS en Linux is dit vrij makkelijk te bewerkstelligen via userland filesystems, spijtig genoeg heb ik als platform win32 gekozen en zijn de headerfiles om dit soort trucjes op microsofts OS te doen extreem duur.
Implementatiemedia detectorZoals eerder vermeld zal het eerste stukje van ons mediasysteem uit een simpel shellscriptje bestaan. Naargelang het platform / configuratie van de machine kan dit op enkele manieren gebeuren. Ik ga het volledige systeem op een windows bak bouwen met in het achterhoofd dat functionaliteit makkelijk geport moet kunnen worden naar een ander platform.Communiceren met de Windows API kan sinds WMI met scripting talen gebeuren runCommand krijgt 4 argumenten mee bij execute;
runCommand is gedefinieerd als ripcd.bat; Als er bijvoorbeeld een CDRom ingestoken wordt in cddrive D: met volumenaam "Coole filmpjes" en het serienummer "1B1A83CC" zal het commando dat uitgevoerd wordt hetvolgende zijn:
mediadetector.vbsStap ÈÈn van de cdripper is klaar; op naar nr 2: ripcd.bat ripcd.batRipcd is wederom een shellscriptje, ditmaal echter eentje die andere systembinaries aanspreekt voor zijn functie te vervullen; nadat gedetecteerd is dat er een 'nieuwe' cd in de machine zit moet er beslist worden wat voor actie er ondernomen wordt; als het mediatype DVD is moet er op een andere manier mee omgesporgen worden dan bij een CD-RW bijvoorbeeld. Handig kan zijn om in deze stap ook een 'backup' subje in het script te hangen zodat indien het geen mediacd is er iets interessants met de data kan gebeuren.Op dit moment echter is de mediaripping functionaliteit het enige wat belangerijk is. De voornaamste functies die ripcd zal moeten doen zijn:
1 @echo off
2 ::: ripcd.bat run actions on inserted new media
3 ::: ©2004 GPL Matthijs Dalhuijsen -- http://thijs.dalhuijsen.com
4 goto MAIN
5 :USAGE
6 echo Usage: %0 "Drive" "Type" "Serial" "Title"
7 echo eg %0 "D:" "CD-ROM" "1B1A83CC" "Coole filmpjes"
8 :MAIN
9 set MOPS="-ovc xvid -oac ac3"
10 set STORAGE="C:\STORE\"
11 set MENCODER="%ProgramFiles%.\mplayer\mencoder.exe"
12 :CHKSTOR
13 if exist %STORAGE% goto :CHKXST
14 goto ERR_NOSTORE
15 :CHKXST
16 if exist %STORAGE%.\%3 goto :XSTINDB
17 goto ALLGO
18 :ALLGO
19 set TODIR=%STORAGE%.\%3
20 echo "%1" "%2" "%3" "%4" "%5" "%6" "%7" "%8" "%9" > %TODIR%.\metadata.txt
21 if "%2" == "DVD" goto RIPDVD
22 goto RIPCD
23 goto END
24 :RIPDVD
25 for %%a in (1 2 3 4 5 6 7 8 9 10 11 12) do %MENCODER% dvd://%%a %MOPS% -o %TODIR%.\%%a.avi
26 goto END
27 :RIPCD
28 if exist %TODIR%.\manifest.txt del %TODIR%.\manifest.txt
29 for %%a in (.avi .mpg .mov) do @dir /b/s %1\ | find /I "%%a" >> %TODIR%.\manifest.txt
30 for /f "tokens=1 delims=^M" %%a in ('type %TODIR%.\manifest.txt')
do %MENCODER% "%%a" %MOPS% -o %TODIR%.\%%a.avi
31 goto END
32 :XSTINDB
33 echo Entry %3 already exists!
34 ::: if you want to overwrite directories change END to ALLGO on next line
35 goto END
36 ::
37
38 :ERR_NOSTORE
39 echo No Store! %STORAGE%
40 goto END
41 ::
42 :END
43 ::
op regel 16 wordt met if exist %STORAGE%.\%3 goto :XSTINDB gekeken of de file al geripd is of nietregel 29 worden alle files met gewenste files in een textbestand opgeslagen waarna op regel 30 alle filenames in dit textbestandje worden geript en opgeslagen op diezelfde regel 29 kan je de extensies toevoegen waar het scriptje naar zoekt. dit had evt. ook met for %%a in (.avi .mpg .mov) do dir *.%%a /s /b >> manifest.txt gekund opgelet: de ^M op regel 30 dient vervangen te worden door een letterlijke newline, in edit.exe kan je dit doen door eerst ^P te typen en dan enter Taking care of the clientsClients kunnen op 2 manieren aan files komen van de server. De voorkeur heeft het om op het intranet naar de VCD bak te connecten met je browser. De interface laat dan intranet urls ipv echte urls zien ( \\HOST\share\file.avi ipv http://HOST/share/file.avi )De webinterface herkent client devices op enkele manieren en past de default settings aan naar de connected client, op dat moment begint pas de file gegenereerd te worden die uiteindelijk bekeken wordt. De file houdt de gegenereerde file vast in de buffer tot er diskspace nodig is, vanaf dat dat gebeurt wordt de laatst bekekene file het eerst gedelete, het kan dus zijn dat er een file slechts ÈÈn keer gegenereerd wordt en nooit verwijderd als hij populair genoeg is.
ClientDetectieThe usual bag of browsertricksWe gaan onderzscheid maken tussen een paar verschillende categorien van clients;
Detectie PuntenOm deze categorieÎn er uit te filteren en detecteren hebben we op de server de volgende detecteerbare punten tot onze beschikking:een van de weinige tools voor detectie waar je geen gebruik maakt van javascript zijn enviroment variabelen: Vooral de variablen die de client (browser) meestuurt met een request naar de server kan je gebruiken. In eertste instantie heb je USER_AGENT waarin de browser zijn eigen naam opslaat Natuurlijk is UA matching evil. Browsers liegen zo vaak over wie ze zijn. Echter omdat we enkel proberen opm de default instellingen van ons necoding programmatje goed te krijgen is dit niet zo'n probleem Windows CE based PDA's sturen buiten de gebruikelijke browserstrings nog enkele extra variabelen door die erg handig zijn voor ons voor 2 reden: De variable UA-pixels wordt op eerste request door de browser meegestuurd: We weten nu dat het een PDA is die connect + de afmetingen van het connected platform. Dat PDA's dit doen is niet toevallig; op deze manier is het voor een applicatie nog voor de eerste 'klik' mogelijk output aan te passen aan het connected platform iets wat aan 1 euro per Mb zeker geapreccieerd zal worden Detectie -- ImplementatieDetectie is zo'n straightforward onderwerp dat ik niet al te lang bij deze code ga blijven stilstaan. de .txt linkjes geven steeds de source weer ua.pl.txt Detectie wordt in 2 beurten gedaan, eerst wordt een pagina met redelijk wat random ascii naar de browser verstuurd met daarin de tijd van versturen en de instructie de volgende detect pagina in te laden. Als dit ophalen van de volgende pagina te lang duurt stopt hier de detectie. Anders wordt er hierna een pagina van 750kb gegenereerd en wederom verstuurd en opgehaald. hiermee wordt dan getimed hoeveel de gebruiker aan bandbreedte heeft. Een correcte werkig van http-equiv meta tags is hierbij wel vereist. test de werking hier; detect0.pl en check hier de sources: detect0.pl.txt detect1.pl.txt detect2.pl.txt Netwerkdetectie kan vrij makkelijk door het connected ip adres te splitten op "." en te kijken of de eerste 2 nummers kloppen met het gevraagde subnet. Normaal gezien heb je problemen met IP's te gebruiken en moet je bijvoorbeeld kijken naar de (gemakkelijk te spoofen) X-Forwarded-For http header. In dit geval zijn we enkel geintresseerd ofdat de connectie van het locale netwerk komt en is een vrij eenvoudige oplossingen als dit al voldoende:
#!/usr/bin/perl
# localnet.pl detects if connected user comes from right network
my ($first, $second, undef, undef) = split(/\./,$ENV{REMOTE_ADDR});
if ($first == 192 && $second == 168) {
print "Location: intranet.html\n\n";
} else {
print "Location: internet.html\n\n";
}
Is voor de hand liggend maar is dependant op het gekozen authenticatie mechanisme bij standaard http authenticatie op apache bijvoorbeeld: perl: defined $ENV{REMOTE_USER} && print "Location: authenticated.html\n\n"; php: if (isset($_SERVER[REMOTE_USER])) { Header("Location: authenticated.html\n\n") }
De laatste loodjesDe data staat geript klaar op het filesystem, de connected client is bekend, wat rest is het renderen van de file en de client een url te verschaffen.Dit laatste (url verschaffen) is snel genoeg gedaan: er moet enkel even gekeken worden of het file://HOSTNAME/share/SERIENR/file.avi of http://HOSTNAME/share/SERIENR/file.avi moet zijn. maw iets als: printf "%s://%s/%s/%s", ($localnet ? "file" : "http"), $ENV{SERVER_NAME}, $share, $reqfile; last but not least: het omrenderen van de file op maat; hier kan je op zich alles instoppen wat mencoder kan, maar in de meeste gevallen zal enkel beeldformaat en kbps van belang zijn. als voorbeeld het scriptje wat voor PDA's geactiveerd wordt:
1 @echo off
2 ::: pda.bat custom encoding for pdas
3 ::: ©2004 GPL Matthijs Dalhuijsen -- http://thijs.dalhuijsen.com
4 ::: Usage: %0 c:\path\to\infile.avi c:\path\to\outfile.avi
5 mencoder -oac copy -ovc copy -vop scal=160x120 "%1" -o "%2" > NUL
Uiteindelijk de client pcOmdat de c:\path\to\outfile hierboven bekend is is het nu maar een kwestie van deze in de vorm van een bereikbare url aan de client pc aan te geven. Dit kan zelfs rechtstreeks gebeuren zonder enige andere tussenklik. 2 dingen waar op gelet moet worden is de file-extensie en een correcte mime-type zodat de juiste player wordt geopend. De file extensie is vooral voor enkele windows versies van belang, maar gelukkig kan een querystring trucje hier soms uitweg bieden.bijvoorbeeld: /cgi-bin/dynamische_avi.pl?id=002314&iesux=thecorrectname.aviwaardan in dynamische_avi.pl de juiste Content-Type: header wordt meegestuurd, bijvoorbeeld voor avi; print "Content-Type: video/x-msvideo\n\n";     referentieshttp://www.webstandards.org/buzz/archive/2002_12.html#a000123http://www.microsoft.com/resources/documentation/windows/2000/server/scriptguide/en-us/default.mspx http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/detecting_media_insertion_or_removal.asp http://www.mplayerhq.hu/DOCS/man/en/manpage.txt http://www.robvanderwoude.com/robnavbat.html | ||||
| JAVP31 | ||||
| HCIK10 - LING11 | ||||
| FULO01 | ||||
| FOTO10 | ||||
| CCP411 - CCP421 | ||||
| ANIM31 | ||||